package com.ruoyi.integration.service.token;

import com.github.benmanes.caffeine.cache.Caffeine;


import com.github.benmanes.caffeine.cache.LoadingCache;
import org.springframework.stereotype.Component;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;

@Component
public class TokenManager {

    // 缓存结构: key = 设备类型, value = Token
    private final LoadingCache<String, String> tokenCache;

    private final Map<String, TokenLoader> loaderMap = new HashMap<>();

    public TokenManager(List<TokenLoader> loaders) {

        // 自动收集所有 TokenLoader 实现类
        loaders.forEach(loader -> loaderMap.put(loader.getDeviceType(), loader));

        this.tokenCache = Caffeine.newBuilder()
                .expireAfterWrite(30, TimeUnit.MINUTES) // 缓存有效期30分钟
                .maximumSize(50) // 最大缓存数量50
                .build(this::loadToken); // 当缓存不存在时，自动调用load()生成缓存
    }

    /**
     * 获取Token
     * @param deviceType
     * @return
     * @throws ExecutionException
     */
    public String getToken(String deviceType) throws ExecutionException {
        return tokenCache.get(deviceType);
    }

    /**
     * 手动刷新Token, 用于在异常时调用
     * @param deviceType
     */
    public void refreshToken(String deviceType) {
        tokenCache.refresh(deviceType);
    }



    private String loadToken(String deviceType) {
        TokenLoader loader = loaderMap.get(deviceType);
        if (loader == null) {
            throw new IllegalArgumentException("未知设备类型: " + deviceType);
        }
        return loader.loadToken();
    }

}
